package ms.demo004;

import java.util.HashMap;
import java.util.concurrent.TimeUnit;

/**
 * Java中，造成内存泄露的原因有很多种。典型的例子是一个没有实现hasCode和equals方法的Key类在HashMap中保存的情况。
 * 最后会生成很多重复的对象。所有的内存泄露最后都会抛出OutOfMemoryError异常，下面通过一段简短的通过无限循环模拟内存泄露的例子说明一下
 */
public class Client {

    public static void main(String[] args) {
        HashMap<Key, String> hashMap = new HashMap<>(1000);

        int count=0;
        while (true){
            hashMap.put(new Key("key"), "value");
            count++;

            if (count%1000==0) {
                System.out.println("map size: " + hashMap.size());
                System.out.println("Free memory after count " + count + " is " + getFreeMemory() + "MB");
                sleep(10);
            }
        }
    }


    public static long getFreeMemory(){
        return Runtime.getRuntime().freeMemory()/(1024*1024);
    }

    public static void sleep(long milliseconds){
        try {
            TimeUnit.MILLISECONDS.sleep(milliseconds);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

class Key{
    private String keyname;
    public Key(String keyname){
        this.keyname = keyname;
    }
}